package com.ddzh.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ddzh.dto.CheckGroupDto;
import com.ddzh.entity.PageReq;
import com.ddzh.entity.PageRes;
import com.ddzh.mapper.CheckGroupMapper;
import com.ddzh.pojo.CheckGroup;
import com.ddzh.pojo.CheckGroupItem;
import com.ddzh.pojo.Setmeal;
import com.ddzh.service.CheckGroupItemService;
import com.ddzh.service.CheckGroupService;
import com.ddzh.vo.CheckGroupVo;
import io.netty.util.internal.StringUtil;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service
public class CheckGroupServiceImpl extends ServiceImpl<CheckGroupMapper, CheckGroup> implements CheckGroupService {
    /*
    1. 同一个项目中的对象之间相互引用不属于网络之间数据交互，不需要用@Reference注解引用
    2. 为什么这里用的Service实例操作数据库，而不是用mapper中实例？体现的是分层的思想，不然要分层干嘛

     */

    @Resource
    private CheckGroupItemService checkGroupItemService;

    @Resource
    private SetmealServiceImpl setmealService;
    @Override
    public boolean deleteById(Long groupId) {
        //查询对应检查组是否存在
        Setmeal setmeal = setmealService.findByItemId(groupId);
        if(setmeal!=null && setmeal.getIs_delete()==0){
            return false;
        }
        //没有被使用就可以删除
        CheckGroup checkGroup = new CheckGroup();
        checkGroup.setId(groupId);
        checkGroup.setIs_delete(1);
        //根据id更新组数据
        return this.updateById(checkGroup);
    }

    @Override
    public PageRes<CheckGroup> findByPage(PageReq pageReq) {

        PageRes<CheckGroup> pageRes = new PageRes<>();

        IPage<CheckGroup> iPage =new Page<>();
        iPage.setSize(pageReq.getPageSize());
        iPage.setCurrent(pageReq.getCurrentPage());

        QueryWrapper<CheckGroup> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("is_delete",0);
        //按姓名模糊查询
        if (StringUtil.isNullOrEmpty(pageReq.getQueryString())==false) {//需要加条件判断不为null的情况下才加like
            /*为什么不直接用它：因为这里需要的和上一个条件is_delete进行and连接
            queryWrapper.like("name", pageReq.getQueryString()).or()
                    .like("code",pageReq.getQueryString()).or()
                    .like("helpCode",pageReq.getQueryString());*/
            queryWrapper.and(wrapper->{
                wrapper.like("name", pageReq.getQueryString()).or()
                        .like("code",pageReq.getQueryString()).or()
                        .like("helpCode",pageReq.getQueryString());
            });
        }
        queryWrapper.orderByDesc("id");//按照列降序排序，新增数据会在前面
        IPage<CheckGroup> page = this.page(iPage, queryWrapper);

        pageRes.setList(page.getRecords());
        pageRes.setTotal(page.getTotal());
        return pageRes;
    }

    @Override
    @Transactional //统一事务，两个事务就会合并
    public Object saveOrUpdateDto(CheckGroupDto checkGroupDto) {

        if (checkGroupDto.getCheckGroup().getId()==0){//添加检查组
            if (this.baseMapper.findByCode(checkGroupDto.getCheckGroup().getCode())!=null){
                return false;
            }
            if (this.baseMapper.findByName(checkGroupDto.getCheckGroup().getName())!=null){
                return false;
            }
        }

        //保留项目组数据
        this.saveOrUpdate(checkGroupDto.getCheckGroup());//内部存在事务，但是此时失效了

        //保留检查项信息=>向中间表插入数据==》遍历数组插入（维护中间表数据）
        //插入之前先清空之前维护的数据
        checkGroupItemService.deleteByGroupId(checkGroupDto.getCheckGroup().getId());
        //需要判断检查项id是否为null
        System.out.println("checkItemGroupDto.getItemIds() = " + Arrays.toString(checkGroupDto.getItemIds()));
        ArrayList<CheckGroupItem> list = new ArrayList<>();
        if (checkGroupDto.getItemIds()!=null){//细节 - 判空
            for (Long itemId : checkGroupDto.getItemIds()) {//细节 - 遍历
                CheckGroupItem checkGroupItem = new CheckGroupItem();
                checkGroupItem.setGroupId(checkGroupDto.getCheckGroup().getId());
                checkGroupItem.setItemId(itemId);
                list.add(checkGroupItem);
                //保存检查项信息
//                checkGroupItemService.save(checkGroupItem);//单条数据插入，内部事务失效
            }
            checkGroupItemService.saveBatch(list);
        }


        return true;
    }

    @Override
    public List<CheckGroup> finAll() {
        QueryWrapper<CheckGroup> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("is_delete" ,0);
        return list(queryWrapper);
    }

    @Override
    public List<CheckGroupVo> getDetail(Long setmealId) {
        return this.baseMapper.getDetail(setmealId);
    }

}
